import java.util.ArrayList;
import java.util.Iterator;

import org.jdom2.Element;


public class Juego {
	
	static private Juego instancia;
	private Pacman pacman;
	private ArrayList<Fantasma> listaFantasmas;
	private Laberinto laberinto;
	private int turnosTranscurridos;
	private boolean finJuego;
	private boolean activarEscape;
	
	public Juego() {
		laberinto = new Laberinto();
		turnosTranscurridos = 0;
		listaFantasmas = laberinto.getFantasmas();
		pacman = laberinto.getPacman();
		finJuego = false;
		activarEscape = false;
	}
	
	public void activarEscape(){
		activarEscape = true;
	}

	public void desactivarEscape(){
		activarEscape = false;
	}
	
	static public Juego getInstance() {
		if ( instancia == null ) {
			instancia = new Juego();
		}
		
		return instancia;
	}
	
	public void setearPacman( Pacman miPacman ) {
		pacman = miPacman;
	}
	
	public void agregarFantasma( Fantasma nuevo ) {
		listaFantasmas.add( nuevo );
	}
	
	public boolean esFinalDeJuego() {
		return false;
	}
	
	public void pasarTurno() {
		if (finJuego == false) {

			if (activarEscape){
				convertirFantasmasEnPresas();
			}

			turnosTranscurridos++;
			if((turnosTranscurridos%30) == 0){
				molestarFantasmas();
			}
			System.out.println("nuevo turno " + turnosTranscurridos);
			Posicion posicionPacman = pacman.enDondeEstoy();
			Posicion posicionActual = actualizarPacman( posicionPacman );
			actualizarFantasmas(posicionActual, posicionPacman);
			if (!pacman.isVivo()) finJuego = true;

			Adapter adapter = new Adapter(this.laberinto, this.pacman, this.listaFantasmas);
			adapter.guardarEstadoPartida();
			
			laberinto.imprimirLaberinto(); // le agregue esto para q imprima el final.
		
		}
	}
	
	private Posicion actualizarPacman( Posicion posActual ) {
		
		Posicion posicionPacman = posActual;
		CreadorDireccion creadorDir= null;
		Direccion direccionLeida = null;
		if ( (turnosTranscurridos%2) == 0 ) {
			int nrotick= turnosTranscurridos/2;
			Posicion antiguaPos = pacman.enDondeEstoy();
			Posicion nuevaPos = null;
			try {
				creadorDir= new CreadorDireccion(nrotick);
				direccionLeida = creadorDir.crear();
				System.out.println("ahora el pacman se mueve a:"+ direccionLeida.name());
				nuevaPos = antiguaPos.adjacente(direccionLeida);
			} catch (Exception t){
				finJuego = true;
				nuevaPos = antiguaPos;
			}
			
			pacman.mover(nuevaPos);
			posicionPacman = nuevaPos;
		} 

		return posicionPacman;
		
	}
	
	public void actualizarFantasmas(Posicion posFinalPacman,
			Posicion posInicialPacman) {
		Iterator<Fantasma> iter = listaFantasmas.iterator();
		Fantasma fantasma = null;
		int velocidadDelActual = 3;
		Posicion posInicialFantasma = null;
		while (iter.hasNext()) {
			fantasma = iter.next();
			posInicialFantasma = fantasma.enDondeEstoy();
			velocidadDelActual = fantasma.getCurrentState().getVelocidad();
			if ((turnosTranscurridos % velocidadDelActual) == 0) {
				System.out.println("ahora se puede mover el fantasma ");
				fantasma.mover(posInicialPacman);
			}
			if ((posFinalPacman.Equals(posInicialFantasma) && posInicialPacman.Equals(fantasma.enDondeEstoy()))
					|| posFinalPacman.Equals(fantasma.enDondeEstoy())) {
				try {
					fantasma.cambiarEstadoSiguiente(Evento.morir);
					fantasma.getCronometro().getRelojPresa().finalizar();
					fantasma.getCronometro().getRelojMuerto().start();
					fantasma.mover(fantasma.posicionInicial);
					System.out.println("fantasma muerto");
				} catch (Exception t) {
					if (!t.getMessage().equals("Fantasma muerto")) {
						System.out.println(t.getMessage());
						this.pacman.morir();
					}

				}

			}
		}
	}

	
	public void molestarFantasmas() {
		Iterator<Fantasma> iter = listaFantasmas.iterator();
		Fantasma uno = null;

		while (iter.hasNext()) {
			uno = iter.next();
			try {
				uno.cambiarEstadoSiguiente(Evento.molestar);
				uno.incrementarVision();
				System.out.println("lo molestaron ");
			} catch (Exception t) {

			}
		}
	}

	public void convertirFantasmasEnPresas() {

		Iterator<Fantasma> iter = listaFantasmas.iterator();
		Fantasma uno = null;
		while (iter.hasNext()) {
			uno = iter.next();
			try {
				uno.cambiarEstadoSiguiente(Evento.escapar);
				uno.getCronometro().getRelojPresa().start();
				System.out.println("ahora esta escapando");
				this.desactivarEscape();
			} catch (Exception t) {
			}
		}

	}

}
